package com.zp.qualitypractice.Bean;

import android.os.Parcel;
import android.os.Parcelable;

import java.io.Serializable;

/**
 * Created by izp on 2017/4/14.
 * 有泛型貌似不能使用Parcelable
 */

public class ParcelResponse<T extends Parcelable> implements Serializable,Parcelable {
    private int resultCode;
    private T returnObject;
    private Parcelable ruturnInfo;

    public int getResultCode() {
        return resultCode;
    }

    public ParcelResponse setResultCode(int resultCode) {
        this.resultCode = resultCode;
        return this;
    }

    public T getReturnObject() {
        return returnObject;
    }

    public ParcelResponse setReturnObject(T returnObject) {
        this.returnObject = returnObject;
        return this;
    }

    public Object getRuturnInfo() {
        return ruturnInfo;
    }

    public ParcelResponse setRuturnInfo(Parcelable ruturnInfo) {
        this.ruturnInfo = ruturnInfo;
        return this;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.resultCode);
/*
* 反序列化之所失败，就是因为我们拿不到泛型对应类的classLoader,那么从这个角度出发，
* 我们是否可以序列化的时候先保存这个泛型的标准类名（报名+类名，例如：com.feeyo.DataEntity），
* 然后再反序列化的时候利用Java 反射得到classLoader*/
        dest.writeString(returnObject.getClass().getName());//临时写入非成员变量String

        dest.writeParcelable(this.returnObject, flags);
        dest.writeParcelable(this.ruturnInfo, flags);
    }

    public ParcelResponse() {
    }

    protected ParcelResponse(Parcel in) {
        this.resultCode = in.readInt();
        String dataName = in.readString();//取出非成员变量String
        try {
            this.returnObject = in.readParcelable(Class.forName(dataName).getClassLoader());
//        this.returnObject = in.readParcelable(T.class.getClassLoader());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        this.ruturnInfo = in.readParcelable(Object.class.getClassLoader());
    }

    public static final Parcelable.Creator<ParcelResponse> CREATOR = new Parcelable.Creator<ParcelResponse>() {
        @Override
        public ParcelResponse createFromParcel(Parcel source) {
            return new ParcelResponse(source);
        }

        @Override
        public ParcelResponse[] newArray(int size) {
            return new ParcelResponse[size];
        }
    };
}
